package com.example.lib5.RecursionTest;

public class Queue8 {
    static int count=0;
    static int judgeCount=0;
    static int max=8;
    static int[] array=new int[max];
    public static void main(String[] args) {
        place(0);//0表示第一个皇后,这里是表示放置第一个皇后的位置为0开始
        System.out.println("一共有多少种解法："+count);
        System.out.println("一共有多少步："+judgeCount);
    }

    /**
     * 放置第几个皇后
     * @param n n表示n+1个皇后（0表示第一个皇后，1表示第二个皇后……）
     */
    public static void place(int n) {

        //如果为8表示已经已经完成了
        if (n==max) {
            count++;
            //打印
            print();
            return;
        }
        //表示没有完成，就要继续设置点，进行验证，第n个皇后放置的所有列的情况
        for (int i = 0; i < max; i++) {//i表示皇后放置的列位置
            //先把这个8皇后n，放入到i列
            array[n]=i;//假设成功放入，然后后面再推是否成功
            //如果不冲突，接着放n+1个皇后
            if (judge(n)){
                place(n+1);//放置好后，再放下一个
            }
        }


    }

    /**
     *
     * @param n 第几个皇后
     * @return true表示符合，false表示不符合
     */
    private static boolean judge(int n) {
        judgeCount++;
        //如果在同一列上，或者同一斜线上，就返回false
        for (int i = 0; i < n; i++) {//逐个遍历出前面的那个

            if (array[n]==array[i]||Math.abs(n-i)==Math.abs(array[n]-array[i])) {
                return false;
            }
        }
        return true;
    }

    private static void print() {
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+"  ");
        }
        System.out.println();
    }
}
